// 生成一个地图 9 * 9
function productMap(n) {
    const randomMap = []
    for (let y = 0; y < n; y++) {
        for (let x = 0; x < n; x++) {
            let value = parseInt(Math.random() * 5 + 1)
            if (!randomMap[y]) {
                randomMap[y] = []
            }
            //  x方向判断有没有连续两个同色
            if (x > 1 && judgeSameColor(randomMap[y], value)) {
                value = getExceptRandom(value)
            }
            if (
                y > 1 &&
                judgeSameColor(getTwoArrColumnByIndex(randomMap, y), value)
            ) {
                value = getExceptRandom(value)
            }
            randomMap[y].push(value)
        }
    }
    return randomMap
}

function getExceptRandom(exceptNum) {
    let value = parseInt(Math.random() * 5 + 1)
    while (value === exceptNum) {
        value = parseInt(Math.random() * 5 + 1)
    }
    return value
}

/**
 * 获取二维数组某一列的值
 * @param {Array} arr
 * @param {number} n
 */
function getTwoArrColumnByIndex(arr, n) {
    return arr.map(item => item[n])
}
// 判断是否连续几个同色
function judgeSameColor(arr, value) {
    return arr.find(
        (item, index) =>
            arr[index - 1] && item === value && arr[index - 1] === value
    )
}

//判断是否是死图
function judgeCanRemoveByOneStep(map) {
    const resultStep = []
    let len = map.length
    for (let y = 0; y < len; y++) {
        for (let x = 0; x < len; x++) {
            const currentValue = map[y][x]
            // 考虑横轴方向
            if (x + 1 < len) {
                // 第一种情况
                if (map[y][x] === map[y][x + 1]) {
                    if (x - 2 >= 0) {
                        if (map[y][x - 2] === currentValue) {
                            resultStep.push({ y, x })
                            resultStep.push({ y, x: x + 1 })
                            resultStep.push({ y, x: x - 2 })
                            return resultStep
                        }
                    }
                    if (x - 1 >= 0 && y - 1 >= 0 && map[y - 1][x - 1] === currentValue) {
                        resultStep.push({ y, x })
                        resultStep.push({ y, x: x + 1 })
                        resultStep.push({ y: y - 1, x: x - 1 })
                        return resultStep
                    }
                    if (x + 2 < len && y - 1 > 0 && map[y - 1][x + 2] === currentValue) {
                        resultStep.push({ y, x })
                        resultStep.push({ y, x: x + 1 })
                        resultStep.push({ y: y - 1, x: x + 2 })
                        return resultStep
                    }
                    if (x + 3 < len && map[y][x + 3] === currentValue) {
                        resultStep.push({ y, x })
                        resultStep.push({ y, x: x + 1 })
                        resultStep.push({ y, x: x + 3 })
                        return resultStep
                    }
                    if (x + 2 < len && y + 1 < len && map[y + 1][x + 2] === currentValue) {
                        resultStep.push({ y, x })
                        resultStep.push({ y, x: x + 1 })
                        resultStep.push({ y: y + 1, x: x + 2 })
                        return resultStep

                    }
                    if (x - 1 > 0 && y + 1 < len && map[y + 1][x - 1] === currentValue) {
                        resultStep.push({ y, x })
                        resultStep.push({ y, x: x + 1 })
                        resultStep.push({ y: y + 1, x: x - 1 })
                        return resultStep
                    }
                }
                if (x - 1 >= 0 && map[y][x] === map[y + 1][x - 1]) {
                    if (y + 1 <= len && x + 1 < len && map[y + 1][x + 1] === currentValue) {
                        resultStep.push({ y, x })
                        resultStep.push({ y: y + 1, x: x + 1 })
                        resultStep.push({ y: y + 1, x: x - 1 })
                        return resultStep
                    }
                    if (y + 2 < len && map[y + 2][x] === currentValue) {
                        resultStep.push({ y, x })
                        resultStep.push({ y: y + 2, x })
                        resultStep.push({ y: y + 1, x: x - 1 })
                        return resultStep
                    }
                }
                if (x + 2 < len && map[y][x] === map[y][x + 2]) {
                    if (x + 1 < len && map[y + 1][x + 1] === currentValue) {
                        resultStep.push({ y, x })
                        resultStep.push({ y: y, x: x + 2 })
                        resultStep.push({ y: y + 1, x: x + 1 })
                        return resultStep
                    }
                }
            }
            // 纵向
            if (y + 1 < len) {
                if (map[y + 1][x] === currentValue) {
                    if (y - 2 >= 0 && map[y - 2][x] === currentValue) {
                        resultStep.push({ y, x })
                        resultStep.push({ y: y + 1, x })
                        resultStep.push({ y: y - 2, x })
                        return resultStep
                    }
                    if (x + 1 < len && y - 1 > 0 && map[y - 1][x + 1] === currentValue) {
                        resultStep.push({ y, x })
                        resultStep.push({ y: y - 1, x })
                        resultStep.push({ y: y - 1, x: x + 1 })
                        return resultStep
                    }
                    if (x + 1 < len && y + 2 < len && map[y + 2][x + 1] === currentValue) {
                        resultStep.push({ y, x })
                        resultStep.push({ y: y + 1, x })
                        resultStep.push({ y: y + 2, x: x + 1 })
                        return resultStep
                    }
                    if (y + 3 < len && map[y + 3][x] === currentValue) {
                        resultStep.push({ y, x })
                        resultStep.push({ y: y + 1, x })
                        resultStep.push({ y: y + 3, x: x })
                        return resultStep
                    }
                    if (x - 1 >= 0 && y + 2 < len && map[y + 2][x - 1] === currentValue) {
                        resultStep.push({ y, x })
                        resultStep.push({ y: y + 1, x })
                        resultStep.push({ y: y + 2, x: x - 1 })
                        return resultStep
                    }
                    if (x - 1 >= 0 && y - 1 >= 0 && map[y - 1][x - 1] === currentValue) {
                        resultStep.push({ y, x })
                        resultStep.push({ y: y + 1, x })
                        resultStep.push({ y: y - 1, x: x - 1 })
                        return resultStep
                    }
                }
            }
        }
    }
}

export function getRandomMap(n) {
    let map = productMap(n)
    if (!judgeCanRemoveByOneStep(map)) {
        map = productMap(n)
    }
    console.log(map)
    return map
}